package site.addzero.cli.autoinit.common

import org.koin.core.annotation.Single
import site.addzero.cli.packagemanager.PackageManagerStrategty.Companion.getSupportPackageManager
import site.addzero.cli.platform.PlatformTools
import site.addzero.cli.platform.runBoolean
import site.addzero.cli.platform.runCmd
import site.addzero.task.InitTask

/**
 * Node.js 环境自动初始化类
 * 负责检查 Node.js 是否安装，选择并安装包管理器 (npm/pnpm/yarn)
 */
@Single
class AutoInitNodejs : InitTask {
    override val support: Boolean = true

    /**
     * 执行 Node.js 初始化任务
     */
    override suspend fun asynctask(): Boolean {
        // 检查 Node.js 是否已安装
        if (!isNodejsInstalled()) {
            println("Node.js 未安装")
            val installNodejs = PlatformTools.readBoolWithTrue("是否安装 Node.js？")
            if (installNodejs == true) {
                val supportPackageManager = getSupportPackageManager()
                supportPackageManager.installPackage("node")
                println("请先安装 Node.js，可从 https://nodejs.org 下载安装")
            }
        } else {
            println("Node.js 已安装")
            // 检查是否已安装包管理器
            checkAndInstallPackageManager()
        }
        
        return true
    }

    /**
     * 检查 Node.js 是否已安装
     */
    private fun isNodejsInstalled(): Boolean {
        return "node --version".runBoolean()
    }

    /**
     * 检查并安装包管理器
     */
    private fun checkAndInstallPackageManager() {
        // 检查是否已安装 npm/pnpm/yarn
        val hasNpm = "npm --version".runBoolean()
        val hasPnpm = "pnpm --version".runBoolean()
        val hasYarn = "yarn --version".runBoolean()

        // 如果已安装任意一个包管理器，则不需要再安装
        if (hasNpm || hasPnpm || hasYarn) {
            val installedManagers = mutableListOf<String>()
            if (hasNpm) installedManagers.add("npm")
            if (hasPnpm) installedManagers.add("pnpm")
            if (hasYarn) installedManagers.add("yarn")

            println("已安装的包管理器: ${installedManagers.joinToString(", ")}")
            return
        }

        // 询问用户选择包管理器
        println("未检测到包管理器 (npm/pnpm/yarn)")
        println("请选择要安装的包管理器:")
        println("1. npm (Node.js 默认包含)")
        println("2. pnpm (更快的包管理器)")
        println("3. yarn (Facebook 开发的包管理器)")

        val choice = PlatformTools.readBoolWithTrue("是否安装包管理器？")
        if (choice != true) return

        print("请输入选择 (1/2/3): ")
        val input = PlatformTools.readLine()

        when (input?.trim()) {
            "1" -> {
                // npm 是 Node.js 默认包含的，不需要额外安装
                println("npm 已随 Node.js 一起安装")
            }
            "2" -> {
                // 安装 pnpm
                installPnpm()
            }
            "3" -> {
                // 安装 yarn
                installYarn()
            }
            else -> {
                println("无效选择，跳过包管理器安装")
            }
        }
    }

    /**
     * 安装 pnpm
     */
    private fun installPnpm() {
        println("正在安装 pnpm...")
        val result = "npm install -g pnpm".runCmd()

        if (result.isSuccess()) {
            println("pnpm 安装成功")
        } else {
            println("pnpm 安装失败: ${result.error}")
        }
    }

    /**
     * 安装 yarn
     */
    private fun installYarn() {
        println("正在安装 yarn...")
        val result = "npm install -g yarn".runCmd()

        if (result.isSuccess()) {
            println("yarn 安装成功")
        } else {
            println("yarn 安装失败: ${result.error}")
        }
    }
}
